package org.flightofstairs.adirstat; import com.google.common.base.Optional; import lombok.SneakyThrows; import javax.annotation.Nonnull; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import static java.net.URLConnection.guessContentTypeFromName; import static java.net.URLConnection.guessContentTypeFromStream; public final class FileUtils { public static final String DIRECTORY_MIMETYPE = "inode/directory"; @SneakyThrows public static Optional<String> getMimeType(@Nonnull File file) { if (file.isDirectory()) return Optional.of(DIRECTORY_MIMETYPE); try { Optional<String> possibleMimeType = Optional.fromNullable(guessContentTypeFromName(file.getAbsolutePath())); if (!possibleMimeType.isPresent()) { FileInputStream inputStream = null; try { inputStream = new FileInputStream(file); possibleMimeType = Optional.fromNullable(guessContentTypeFromStream(inputStream)); } catch (IOException e) { return Optional.absent(); } finally { if (inputStream != null) inputStream.close(); } } return possibleMimeType; } catch (StringIndexOutOfBoundsException ignored) { return Optional.absent(); } } private FileUtils() { } }